#ifndef UTILIDAD_H
#define	UTILIDAD_H

#include <string>
#include "Posicion.h"
#include "Rol.h"
#include "ISerializable.h"
#include "IColisionado.h"
#include "UtilidadesConstantes.h"
#include "tinyxml.h"

using namespace std;
using namespace TP::Serializacion;
using namespace TP::Juego::Arena;
using namespace TP::Juego::Motorizacion::Fisica;
using namespace TP::Juego::Motorizacion::Colisiones;

namespace TP { namespace Juego { namespace Arena { namespace Utilidades {

class Utilidad : public IColisionado, public ISerializable {
public:
    
    virtual ~Utilidad();
    
    virtual Posicion* setPosicion (Posicion* pPosicion);
    
    Posicion* getPosicion ();
    
    Rol* getRol();
    
    /* Devuelve un puntero a una copia de la utilidad, creado con new */
    virtual Utilidad* clonar() = 0;
    
    virtual string aXML();
    
    virtual string aXML(const string& pPath);
    
    virtual void parseXML (const string& pDescriptor);
    
    virtual TiXmlElement* aElementoXML ();
    
    virtual void deElementoXML (TiXmlElement* pElemento);   
    
    static Utilidad* deElementoXMLGenerico (TiXmlElement* pElemento);
        
    // Retorna la vida del actor.
    double getVida();
    
    // Setea la vida del actor.
    void setVida(double vida);
    
    // Pone a 0 la vida del actor.
    void destruir();
    
    // Retorna true si el actor fue destruido; de lo contrario, retorna false.
    bool destruido() const;
    
    // Setea si el actor es enemigo del player o no.
    void setEsEnemigo(bool esEnemigo);
    
    // Retorna true si el actor es enemigo del player; de lo contrario,
    // retorna false.
    bool esEnemigo() const;
    
    // Decrementa la energía del actor con la cantidad de energía pasada.
    void decrementarEnergia (double cantidadEnergia);
    
    // Retorna el radio del actor.
    virtual double getRadio() = 0;
    
    // Retorna los puntos del actor por ser destruido.
    virtual int getPuntosDestruccion() = 0;    

protected:
    Posicion* _posicion;
    Rol* _rol;
    double _vida;
    bool _enemigo;
    Utilidad();
};
}}}}

#endif	/* UTILIDAD_H */